import { apiGet, apiPost } from './http';

// 通用后端响应结构（根据页面使用模式：code+msg+data）
export interface ApiResponse<T = any> {
  code: number;
  msg?: string;
  data: T;
  [k: string]: any; // 兼容后端额外字段（total/page 等）
}

// 包装条目（仅基础字段，视需要可在页面做转换）
export interface PackageItem {
  id: string;
  code?: string;
  name: string;
  description?: string;
  unitCost?: number;
  status: 'enabled' | 'disabled';
  unit?: string;
  createdAt?: number;
  updatedAt?: number;
  bomS?: Array<{ bom: { id?: string; feeModel?: 'fixed' | 'count'; feeAmount?: number; [k: string]: any }; quantity?: number }>;
  // 允许额外字段透传
  [k: string]: any;
}

// 搜索参数（与页面 payload 对齐）
export interface PackageSearchParams {
  page: number;
  pageSize: number;
  name?: string;
  status?: string; // enabled | disabled
}

// 搜索结果 data 结构（后端不同命名兼容）
export interface PackageSearchData {
  records?: any[];
  total?: number;
  page?: number; // 有的后端用 page
  current?: number; // 有的后端用 current
  pageSize?: number; // pageSize
  size?: number; // size
  totalPages?: number; // totalPages
  pages?: number; // pages
  [k: string]: any;
}

function assertSuccess<T>(res: ApiResponse<T>, defaultMsg: string): ApiResponse<T> {
  if (res.code !== 200 && res.code !== 0) {
    throw new Error(res.msg || defaultMsg);
  }
  return res;
}

/**
 * 包装方式分页搜索（与页面 search 函数对应）
 */
export async function searchPackages(payload: PackageSearchParams & { [k: string]: any } ): Promise<ApiResponse<PackageSearchData>> {
  const res = await apiPost<ApiResponse<PackageSearchData>>('/api/package/search', payload);
  return assertSuccess(res, '查询失败');
}

/**
 * 新建包装方式（与页面 handleSave 新建逻辑对应）
 */
export async function addPackage(payload: { name: string; pic?: string; bomS: any[]; status?: string; [k: string]: any }): Promise<ApiResponse<any>> {
  const res = await apiPost<ApiResponse<any>>('/api/package/add', payload);
  return assertSuccess(res, '新建失败');
}

/**
 * 编辑包装方式（与页面 handleSave 编辑逻辑对应）
 */
export async function editPackage(payload: { id: string; name: string; pic?: string; bomS: any[]; status?: string; [k: string]: any }): Promise<ApiResponse<any>> {
  const res = await apiPost<ApiResponse<any>>('/api/package/edit', payload);
  return assertSuccess(res, '编辑失败');
}

// 可选：统一导出转换/工具（以后若需要在 service 层做数据转换，可在此补充）
export const packageService = {
  searchPackages,
  addPackage,
  editPackage
};
